home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
User's Choice Windows CD
/
User's Choice Windows CD (CMS Software)(1993).iso
/
utility2
/
wnders22.zip
/
WINDERS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-18
|
12KB
|
428 lines
/*
Written By: Earl W. Hartsell
Date: 8 - 16 - 92
Name: WINDERS
Version: 2.2
Use: WINDERS allows the user to choose to automatically run
Windows or exit to DOS upon startup or reboot.
It allows the user to specify a length of time to
countdown before Windows 3.X is loaded.
Windows may be loaded before the countdown
is complete by pressing one of the modifier keys
([SHIFT], [ALT], or [CTRL]), the user may also
exit to DOS pressing any other key.
The syntax for the command is as follows:
d:\<path>\WINDERS [num] [/A <args>] [/B] [/D <d:>] [/I] [/P] [/N <filename>] [/W]
d:\<path>\WINDERS /H
d:\<path>\WINDERS /V
d:\<path>\WINDERS /?
d:\<path>\ is drive and directory path where WINDERS executable is
located.
num is length of pause before loading windows. It must be
first argument and may be range of 1 to 32767 in seconds.
The default pause is 5 seconds. 0 seconds defaults to 5.
/A <args> are the arguments to be passed to windows. The arguments are
not optional and will generate an error if not found after
the /a. There also must be a space between the /a and the
<args> and multiple arguments must be placed inside
quotes. If you have problems getting this to work
try using full path names on the executables.
/B beep on countdown, default no beep.
/D <d:> is to specify drive in where WINDOWS is located.
The default is C:.
/P <path> If executable file to start WINDOWS is not in \WINDOWS\ use
this option to specify the path.
Examples:
\DIR1\DIR2\...\DIRn\WINDOWS\
\WIN\ If WINDOWS is in a directory called WIN.
NOTE: The final back-slash on the path is required.
/N <filename> Used to specify the name of the file to be executed
if it is not WIN.COM.
Example:
Use /N WINDERS.BAT if you want to execute a batch file
before entering windows.
This would be an easy way to disable a DOS screen saver
before starting Windows.
(See WINDERS.BAT)
Note: If you change the name a new shell will
and the batch file will run from that shell which is
not as efficient memory efficient as running
WIN.COM directly.
/I suppress loading Windows into screen. Default show intro screen.
/H or /? help screen.
/V prints out version information.
/W supress display of WINDERS countdown banner.
Copyright (c)1992 By Earl W. Hartsell
This is a Freeware program.
Windows is a registered trademark of Microsoft Corporation.
*/
#include "winders.h"
struct text_info ti;
int main(argc, argv)
int argc;
char *argv[];
{
int i = 0, k = 0, j = 0; /* counters */
int pause = 5; /* default pause */
char w_banner = 1; /* print banner flag */
char beep = 0; /* set default beep off */
char buffer[100]; /* buffer for sprintf */
char show_intro = 1; /* turn intro screen off */
char name_changed = 0;
char drive[3], path[256], name[16], args[256];
time_t start, new; /* long int */
fflush(stdin); /* clear the kbd buffer */
NIL(args); /* clear out arguments to WINDOWS */
strcpy(drive,"C:"); /* default drive C: */
strcpy(path,"\\WINDOWS\\"); /* default directory */
strcpy(name,"WIN.COM"); /* default executable */
if (atoi(argv[1]) > 0) /* take first argument as number */
{
j = 2;
pause = atoi(argv[1]);
}
else
{
j = 1;
pause = 5; /* set default pause to 5 seconds. */
}
for (; j < argc; j++)
{
switch (argv[j][1])
{
/* arguments */
case 'a': case 'A':
if ( argv[j+1] == NULL || argv[j+1][0] == '/' )
{
argerror(argv[0], "A" , 0);
/* Error no argument found */
}
else
{
strcpy(args, argv[++j]); /* pass arguments */
}
break;
/* arguments */
/* beep */
case 'b': case 'B':
beep = 1; /* set beep on */
break;
/* beep */
/* drive */
case 'd': case 'D':
if ( argv[j+1] == NULL || argv[j+1][0] == '/' )
{
argerror(argv[0], "D" , 0);
/* error no argument found */
}
else
{
strcpy(drive, argv[++j]); /* pass arguments */
}
break;
/* drive */
/* help screen */
case 'h': case 'H': case '?':
highvideo();
printf("\n");
center("WINDERS HELP VERSION 2.2\r\n\r\n");
lowvideo();
center("Copyright (c)1992 By Earl W. Hartsell\r\n");
center("This is a Freeware program.\r\n");
printf("%s [num] [/A <args>] [/B] [/D <d:>] [/P <path>] [/N] [/I] [/W]\n",argv[0]);
printf("%s /V or /H or /?\n",argv[0]);
printf("num is duration of countdown, default is 5 seconds.\n");
printf("Num must be the first argument to WINDERS.\n");
printf("/A is the argument(s) to be passed to Windows.\n");
printf("/B causes beeping during countdown.\n");
printf("/D drive where windows is located, C: is the default.\n");
printf("/P path to Windows, default \\WINDOWS\\ \n");
printf("/N used to specify the filename of Windows executable, default WIN.COM\n");
printf("/I suppresses showing Windows intro screen.\n");
printf("/H or /? to print out this screen.\n");
printf("/V display WINDERS version and copyright information.\n");
printf("/W used to turn off WINDERS countdown banner.\n");
printf("Pressing [SHIFT], or [ALT], or [CTRL] during the countdown\n");
printf("will cause Windows to load without continuing the countdown.\n");
printf("Pressing any other key will cause WINDERS to exit to DOS.\n");
printf("\n");
printf("Windows is a registered trademark of Microsoft Corporation.\n");
exit(HLP);
break;
/* help screen */
/* intro screen */
case 'i': case 'I':
show_intro = 0; /* turn on intro screen */
break;
/* intro screen */
/* path */
case 'p' : case 'P':
if ( argv[j+1] == NULL || argv[j+1][0] == '/' )
{
argerror(argv[0], "P", 0);
/* Error no argument found */
}
else
{
strcpy(path, argv[++j]); /* pass arguments */
}
break;
/* name */
case 'n': case 'N':
if ( argv[j+1] == NULL || argv[j+1][0] == '/' )
{
argerror(argv[0], "N", 0);
/* error no argument found to pass to windows */
}
else
{
name_changed = 1;
strcpy(name, argv[++j]); /* pass arguments */
}
break;
/* version screen */
case 'v': case 'V':
clrscr();
fprintf(stderr,"\n");
highvideo();
center("WINDERS VERSION 2.2\r\n");
lowvideo();
center("Copyright (c) 1992 By Earl W. Hartsell\r\n");
center("This is a Freeware program.\r\n");
printf("\n");
printf("\n");
center("Windows is a registered trademark of Microsoft Corporation.\r\n");
exit(VER);
break;
/* version screen */
/* WINDERS banner */
case 'w': case 'W':
w_banner = 0; /* don't print WINDERS countdown banner */
break;
/* WINDERS banner */
/* ERROR in arguments */
default:
fprintf(stderr,"\n%s: Error: Unrecognized Switch %s Will Be Ignored.",argv[0],argv[j]);
DELAY_SECONDS(2);
break;
/* ERROR in arguments */
}
}
k = keyhit(); /* check and see if key has already been selected */
if (k == 1) Winf(drive,path,name,args,show_intro, name_changed);
if (k == 2) Dosf(); /* exit to dos if key is pressed */
clrscr(); /* clear screen */
if (w_banner)
{
highvideo();
textattr(WHITE + (BLUE << 4));
center("╔═══════════════════════════╗");
cprintf("\r\n");
center("║ Winders Countdown ║");
textattr(DARKGRAY);
cprintf("░\r\n");
textattr(WHITE + (BLUE << 4));
center("╚═══════════════════════════╝");
textattr(DARKGRAY);
cprintf("░\r\n");
printf("\t\t\t ");
textattr(DARKGRAY);
cprintf("░░░░░░░░░░░░░░░░░░░░░░░░░░░░\r\n");
cprintf("\r\n");
lowvideo();
}
textattr(LIGHTGRAY);
sprintf(buffer, "Loading Windows in %d seconds.\r\n",pause);
center(buffer);
center("Press [SHIFT], or [ALT], or [CTRL] to load Windows now.\r\n");
center("Press any other key to exit to DOS.\r\n");
center("Counting");
start = time(NULL); /* get initial time in seconds */
for (i=1 ;(i <= pause && !k);i++)
{
new = time(NULL); /* get new time */
while(new - start == 0) /* start time = new time second not elapsed */
{
new = time(NULL); /* get new time again */
k = keyhit(); if (k) break;
}
if (k == 1) Winf(drive,path,name,args,show_intro, name_changed);
if (k == 2) Dosf(); /* exit to dos if key is pressed */
if (new - start != 0)
{
if (beep)
printf("\a.");
else
printf(".");
}
start = new;
}
Winf(drive, path, name, args, show_intro, name_changed);
return (0); /* keeping the compiler happy */
}
/*
keyhit- function returns 0,1, or 2 depending on the key pressed
0 - if no key has been pressed
1 - if SHIFT, CTRL, or ALT has been pressed
2 - if a key other than the ones above has been pressed
*/
int keyhit(void)
{
int modifiers;
modifiers = bioskey(2);
if (modifiers)
{
if (modifiers & RIGHT) return(1);
if (modifiers & LEFT) return(1);
if (modifiers & CTRL) return(1);
if (modifiers & ALT) return(1);
}
if (bioskey(1)) return(2);
return(0);
}
/* Dosf - return to DOS and clear screen */
void Dosf()
{
fflush(stdout);
clrscr();
exit(DOS);
}
/* Winf - execute win.com and pass arguments to it.
args - argumentents to be passed to windows
drive - drive where Windows resides.
path - directory path where windows resides.
name - filename of executable that will run Windows.
intro - 0 will by pass Windows intro using command win :
1 (default) Will show intro screen
changed - 0 name of executable has not been changed.
1 name has changed.
Note: execl was used in the hope that the progam would be
cleared from memory and not take up any space in Windows.
*/
void Winf(drive, path, name, args, intro, changed)
char *drive, *path, *name, *args;
char intro, changed;
{
highvideo();
center("Loading Windows...\r\n");
lowvideo();
strcat(drive,path);
strcat(drive,name);
if (changed)
{
if(!(intro))
strcat(drive," :");
system(drive);
if (errno)
{
printf("%s",sys_errlist[errno]);
}
exit(errno);
}
else
{
if (intro) /* to show into or not to show intro */
execl(drive, name, args, NULL); /* to show */
else
execl(drive, name, ":", args, NULL); /* not to show */
}
printf("%s",sys_errlist[errno]);
exit(errno);
}
int argerror(argv, option, Dlay)
char *argv;
char option[5];
int Dlay;
{
if (Dlay == 0)
Dlay = 2;
fprintf(stderr,"\n%s: Error: Argument Missing Option /%s Ignored, Default Will Be Used.\n",argv,option);
DELAY_SECONDS(Dlay);
return(0);
}
/* center text on screen using CPRINTF */
/* input string of characters to be centered */
int center (string)
char *string;
{
int length, posx = 0;
gettextinfo(&ti);
length = strlen(string);
if (length > ti.screenwidth) return(-1);
posx = (ti.screenwidth /2) - (length /2);
gotoxy(posx,wherey());
cprintf("%s", string);
return(0);
}